Il progetto di Datascience consiste nel trovare un Dataset a proprio piacimento e da esso sviluppare differenti analisi da cui trarre utili considerazioni.
Il Dataset che ho scelto contiene tutte le missioni spaziali registarte dal 1957 fino a metร del 2020. Al suo interno sono presenti le informazioni piรน importanti per ogni missione, tra cui il luogo del lancio, la data e l'ora, il nome della compagnia responsabile della missione, lo stato della missione (se riuscita o fallita) e il costo della missione.
import numpy as np
np.set_printoptions(precision=2)
import plotly.express as px
import plotly.graph_objs as go
import pandas as pd
import country_converter as coco
from plotly.subplots import make_subplots
df=pd.read_csv("data/Space_Corrected.csv", keep_default_na=False)
df['Date'] = df['Datum'].str.findall(r'(\d+(?:\.\d+)?)')
df['year'] = pd.to_numeric(df['Date'].str[1], errors='coerce')
df['cost'] = pd.to_numeric(df[' Rocket'], errors='coerce')
df['country'] = df['Location'].str.split(', ').str[-1]
cc = coco.CountryConverter()
df['iso_country'] = cc.pandas_convert(df['country'], to='ISO3', not_found=None)
Shahrud Missile Test Site not found in regex New Mexico not found in regex Yellow Sea not found in regex Pacific Missile Range Facility not found in regex Pacific Ocean not found in regex Barents Sea not found in regex Gran Canaria not found in regex
Numero di missioni per ogni anno.
In questo grafico si evidenzia lo sviluppo della ricerca spaziale durante gli anni, cosรฌ da permettere di constatare se รจ presente un interesse crescente o meno.
nYears = len(df.groupby(['year']))
countYears = df['year'].value_counts().sort_index()
shape = ['',] * nYears
shape[nYears-1] = '/'
fig = go.Figure(data=[go.Bar(
x=countYears.index,
y=countYears,
marker_pattern_shape=shape
)])
fig.layout["title"] = "Numero missioni annuo"
fig.layout["xaxis"]["title"] = "Anno"
fig.layout["yaxis"]["title"] = "Numero di missioni"
fig.update_layout(
height=500)
fig
Spesa media per ogni anno.
Con il seguente grafico ci si aspetta di trarre un'analisi relativa alle spese per le missioni spaziali durante gli anni, questo permette di capire se con l'aumento di interesse aumenta anche la spesa. In questo caso purtroppo non tutte le missioni hanno un costo registrato, dunque i risultati attesi non sarenno perfettamente precisi.
yearCost = df.groupby('year')['cost'].mean().dropna()
nYears = len(yearCost)
shape = ['',] * nYears
shape[nYears-1] = '/'
fig = go.Figure(data=[go.Bar(
x=yearCost.index,
y=yearCost,
marker_pattern_shape=shape
)])
fig.layout["title"] = "Spesa media annua"
fig.layout["xaxis"]["title"] = "Anno"
fig.layout["yaxis"]["title"] = "Costo delle missioni in $ million"
fig
Costo medio per le missioni durante gli anni delle principali agenzie spaziali.
Con questo grafico si mette in evidenza le agenzie che nel corso della loro vita hanno puntato ad investire di piรน, in questo caso, simile all'analisi precedente, sono selezionate solo le agenzie di cui si possiedono dati relativi al costo delle missioni.
companyCost = df.groupby('Company Name')['cost'].mean().dropna()
fig = px.bar(df, x=companyCost.index, y=companyCost, height=500, width=1000).update_xaxes(categoryorder="total descending")
fig.layout["title"] = "Costo medio per le agenzie durante gli anni"
fig.layout["xaxis"]["title"] = "Company"
fig.layout["yaxis"]["title"] = "Costo medio durante gli anni in $ million"
fig
Percentuale di frequenza dei differenti stati di missione.
In questo Dataset sono stati marcati quattro tipi di stato della missione differenti, di cui quasi un buon 90% รจ costituito solo dalle missioni con esito positivo. Gli altri tre stati rappresentano dei sottoinsiemi delle missioni fallite, da questa constatazione per le analisi successive ho preferito raggruppare i fallimenti sotto un unica categoria, data la loro dimensione molto ridotta.
Grazie a questo grafico รจ anche possibile dedurre che, nonostate le missioni spaziali posseggano un alto rischio di pericolositร , la probabilitร di fallimento รจ relativamente piรน bassa di quanto ci si possa aspettare.
countStatues = df['Status Mission'].value_counts().sort_index()
fig = px.pie(df, values=countStatues, names=countStatues.index, title='Distribuzione percentuali di stato delle missioni', height=500, width=500)
fig.update_traces(textinfo='percent+label', showlegend=False)
fig
Numero di missioni riuscite e di missioni fallite durante gli anni.
Il grafico seguente rappresenta il numero di missioni nei due satati principali (riuscite e fallimenti) per i diversi anni di attivitร , lascia intuire che con il passare del tempo si รจ andati nettamente a migliorare l'efficacia delle missioni, riducendo dunque anche il rischio di fallimento. Negli ultimi anni si denota un leggero aumento dei fallimenti, questo รจ causato anche dall'arrivo delle prime aziende private nell'ambito spaziale, aziende con nessuna esperienza e che hanno avuto diversi problemi iniziali.
countYears = df.groupby(['year', 'status']).size().reset_index()
fig = px.bar(countYears, orientation="v", x="year", y=0, color="status", barmode="group", height=400, width=1300,
category_orders={"status": ["Success", "Failure"]
})
fig.layout["title"] = "Missioni riuscite e fallite durante gli anni"
fig.layout["xaxis"]["title"] = "Anno"
fig.layout["yaxis"]["title"] = "Numero di missioni"
fig.layout["legend"]["title"]["text"] = "Stato"
fig
Numero di missioni riuscite e di missioni fallite per agenzia messo a confronto con la percentuale dei due stati per agenzia.
Con questa tipologia di grafico รจ possibile confrontare direttamente due grafici con la stessa categoria di dati. In questo modo รจ facilmente dedurre quali agenzie siano piรน efficienti nell'eseguire delle missioni con successo, il quale รจ molto variable anche dal numero di missioni effettuate, ma in questo caso anche facimente confrontabile. Per questi grafici ho decisio di estrarre tra le piรน importanti agenzie, cosรฌ da poter valutare solo l'operato di chi ha piรน rilievo. Tra le agenzie governative ho aggiunto le due prime e piรน conosciute agenzie pivate del settore, SpaceX e Blue Origin.
df["status"] = "Failure"
df.loc[df["Status Mission"] == "Success", "status"] = "Success"
companyMission = df.loc[(df["Company Name"] == "NASA") | (df["Company Name"] == "ESA") | (df["Company Name"] == "SpaceX") | (df["Company Name"] == "RVSN USSR") | (df["Company Name"] == "Boeing") | (df["Company Name"] == "US Air Force") | (df["Company Name"] == "ASI") | (df["Company Name"] == "Blue Origin") | (df["Company Name"] == "JAXA") | (df["Company Name"] == "Roscosmos") | (df["Company Name"] == "CASC"), ["Company Name", "status"]]
# serie ordinata in base alle agenzie
orderedCompanyMission = companyMission.groupby(['Company Name']).size().sort_values(0, ascending=False)
# serie ordinata di solo missioni eseguite con successo
successMission = companyMission.loc[companyMission["status"] == "Success", ["Company Name"]]
successMission = successMission.groupby(['Company Name']).size().sort_values(0, ascending=False)
# serie ordinata di solo missioni fallite
failureMission = companyMission.loc[companyMission["status"] == "Failure", ["Company Name"]]
failureMission = failureMission.groupby(['Company Name']).size().sort_values(0, ascending=False)
# dataframe completo ordinato per agenzie con colonne relative al totale delle missioni, quelle eseguite con successo e quelle fallite
result = pd.concat([orderedCompanyMission, successMission, failureMission], axis=1)
color1 = [px.colors.qualitative.Plotly[2]] * len(orderedCompanyMission)
color2 = [px.colors.qualitative.Plotly[1]] * len(orderedCompanyMission)
fig = make_subplots(shared_xaxes=True, vertical_spacing=0.02, rows=2, cols=1)
# Subplot 1 - Totale missioni per agenzia
fig.add_trace(
go.Bar(
name="Total",
x=result.index,
y=result[0],
offsetgroup=0,
),
row=1,
col=1,
)
# Subplot 2 - Percentuale stato missioni per agenzia
fig.add_trace(
go.Bar(
name="Success",
x=result.index,
y=result[1]/result[0]*100,
offsetgroup=0,
marker_color=color1
),
row=2,
col=1,
)
fig.add_trace(
go.Bar(
name="Failure",
x=result.index,
y=result[2]/result[0]*100,
offsetgroup=0,
base=result[1]/result[0]*100,
marker_color=color2
),
row=2,
col=1,
)
fig.update_xaxes(title_text="Company", row=2, col=1)
fig.update_yaxes(title_text="Numero di missioni", row=1, col=1)
fig.update_yaxes(title_text="Percentuale missioni", row=2, col=1)
fig.update_layout(title_text="Rapporto tra missioni e agenzie", height=700)
fig.layout["legend"]["title"]["text"] = "Legenda"
fig.show()
C:\Users\davis\AppData\Local\Temp\ipykernel_19076\3079519082.py:8: FutureWarning: In a future version of pandas all arguments of Series.sort_values will be keyword-only. C:\Users\davis\AppData\Local\Temp\ipykernel_19076\3079519082.py:12: FutureWarning: In a future version of pandas all arguments of Series.sort_values will be keyword-only. C:\Users\davis\AppData\Local\Temp\ipykernel_19076\3079519082.py:16: FutureWarning: In a future version of pandas all arguments of Series.sort_values will be keyword-only.
Costo della missione a confronto con lo stato, missione riuscita o fallita.
Da questo grafico si puรฒ constatare come la maggior parte delle missioni fallite sia raggruppata nella parte con un costo minore, tralasciando qualche eccezzione. Mentre per le missioni eseguite con successo si distribuiscono maggiormente verso il centro, suggerendo che una maggiore spesa aumenti la probabilitร di riuscita della missione.
fig = px.box(df, orientation="h", y="status", x="cost", height=500, width=900)
fig.layout["title"] = "Costo delle missioni in base alla riuscita"
fig.layout["xaxis"]["title"] = "Costo in $ million"
fig.layout["yaxis"]["title"] = "Stato"
fig.show()
Mappa geografica che mostra le nazioni da cui sono state effettuate le missioni.
Questa analisi include il fatto che alcune nazioni elaborano le proprie missioni in collaborazione con altre, da questo definisce anche la posizione del sito di lancio, come l'agenzia Italiana e quella Tedesca affidandosi alla Francia, dov'รจ presente uno dei siti di lancio dell'ESA (Agenzia Spaziale Europea). Tra di esse anche gli stessi USA, negli ultimi anni prima dell'avvento di SpaceX, dopo il ritiro dello Space Shuttle si affidarono alla Russia per lanciare le loro missioni.
countCountry = df['iso_country'].value_counts().sort_index()
fig = px.choropleth(df, locations=countCountry.index,
color=countCountry,
color_continuous_scale=px.colors.sequential.Plasma,
height=600,
width=1000)
fig.update_layout(
title_text='Mappa che mostra le nazioni da cui sono stati effettuati i lanci'
)
fig.layout.coloraxis.colorbar.title = 'Numero lanci'
fig.show()